home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
ctrlt.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-11
|
26KB
|
1,251 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
extern UWORD CRX,CRY;
/* 右向き未確定化開始 */
void
ctrl_t_ctrl_f()
{
UINT c;
if (TBUFFC) {
return;
}
c = line_cpx_code();
if (!c) {
ctrl_f0();
c = line_cpx_code();
if (!c) {
return;
}
} else if (c == CR) {
return;
}
TTOPL00 = line_my_top(); /* キャンセル用に保存 */
TL00 = TL0 = CL; /* 変換バッファの開始行 */
CRX = CRY = 0;
TPX00 = TPX0 = CPX;
TX00 = TX0 = CX;
TY00 = TY0 = CY;
TBP00 = TBP0 = ANALYZE[CPX].BPOS;
xf_init_tb(); /* 変換バッファカウンタ初期化 */
ctrl_f0();
TL1 = CL; /* 変換バッファの終了行 */
TPX1 = CPX;
TX1 = CX;
TY1 = CY;
TBP1 = ANALYZE[CPX].BPOS;
xf_append_tb(c);
disp_show_cursor(); /* カーソルのブリンクを強制的にオンにする */
}
/* タブを見せる<->見せない */
/* トグル */
void
ctrl_t_ctrl_i()
{
TAB_VIEW = !TAB_VIEW;
ctrl_l();
}
/* 改行を∇<->全角スペース */
/* トグル */
void
ctrl_t_ctrl_m()
{
CR_VIEW = !CR_VIEW;
disp_cr_mode();
ctrl_l();
}
/* 行頭なら何もしない */
/* 改行の上なら、カーソルの前とさらにその前 */
/* それ以外なら、カーソルの下とその前を交換する */
/* 後で訂正のこと!!!... */
void
ctrl_t_ctrl_t()
{
UBYTE c;
int p0;
if (CPX) {
if ((((c = line_cpx_1byte()) == EOS) || (c == CR))) {
p0 = CPX - 2;
} else {
p0 = CPX - 1;
}
if (p0 >= 0) { /* CPXが1で、改行の上ということがありうる */
UBYTE w[VERY_LONG_LINE];
int i1,i2,i3;
i1 = ANALYZE[p0].BPOS;
i2 = ANALYZE[p0 + 1].BPOS;
i3 = ANALYZE[p0 + 2].BPOS;
line_cl_strncpy(w,i1);
w[i1] = EOS;
line_cl_strncat(w,i2,i3 - i2);
w[i1 + (i3 - i2)] = EOS;
line_cl_strncat(w,i1,i2 - i1);
w[i3] = EOS;
line_cl_strcat(w,i3);
line_store_and_echo(CL,w); /* 禁則処理で出し入れの可能性有り */
line_cl_cl();
change_check();
work_line_analyze();
work_cursor_cpx();
CX0 = CX;
}
} else {
/* 何もしない */
}
}
/* BAKモードをトグルする */
void
ctrl_t_b()
{
CURRENT_BAK = !(CURRENT_BAK);
disp_btm_bak_10_x(WDATA[CWN].WTEXTS);
}
/* フルワイドでなければフルワイドにする */
/* フルワイドならフルナローにする */
/* トグル */
void
ctrl_t_w()
{
if (ctrl_t_lyw_work_check()) return;
if ((LYW_UPPER) && (LYW_UNDER)) { /* フルワイドである */
ctrl_t_lyw_work(0,LYW_MAIN0,0); /* フルナローにする */
} else { /* フルワイドではない */
/* フルワイドにする */
ctrl_t_lyw_work(LYW_UPPER0,LYW_MAIN0,LYW_UNDER0);
}
}
void
ctrl_t_w0()
{
if (ctrl_t_lyw_work_check()) return;
ctrl_t_lyw_work(0,LYW_MAIN0,0);
}
void
ctrl_t_w1()
{
if (ctrl_t_lyw_work_check()) return;
ctrl_t_lyw_work(LYW_UPPER0,LYW_MAIN0,0);
}
void
ctrl_t_w2()
{
if (ctrl_t_lyw_work_check()) return;
ctrl_t_lyw_work(0,LYW_MAIN0,LYW_UNDER0);
}
void
ctrl_t_w3()
{
if (ctrl_t_lyw_work_check()) return;
ctrl_t_lyw_work(LYW_UPPER0,LYW_MAIN0,LYW_UNDER0);
}
/* アッパーラインをトグルする */
void
ctrl_t_u()
{
if (ctrl_t_lyw_work_check()) return;
ctrl_t_lyw_work((LYW_UPPER) ? 0:LYW_UPPER0,-1,-1);
}
void
ctrl_t_u0()
{
if (ctrl_t_lyw_work_check()) return;
ctrl_t_lyw_work(0,-1,-1);
}
void
ctrl_t_u1()
{
if (ctrl_t_lyw_work_check()) return;
ctrl_t_lyw_work(LYW_UPPER0,-1,-1);
}
/* ロウアーラインをトグルする */
void
ctrl_t_l()
{
if (ctrl_t_lyw_work_check()) return;
ctrl_t_lyw_work(-1,-1,(LYW_UNDER) ? 0:LYW_UNDER0);
}
void
ctrl_t_l0()
{
if (ctrl_t_lyw_work_check()) return;
ctrl_t_lyw_work(-1,-1,0);
}
void
ctrl_t_l1()
{
if (ctrl_t_lyw_work_check()) return;
ctrl_t_lyw_work(-1,-1,LYW_UNDER0);
}
/* この関数が呼ばれる時は、ウインドウは CWN だけ */
/* 初期のハードウェアフォーマットに相当する */
/* -1 なら変えない */
/* 新しい CY を返す */
int
ctrl_t_lyw_work0(int up,int main,int low)
{
register int i,yd;
int dotall1;
int doty,ny;
doty = CY*LYW_TOTAL;
if (up >= 0) LYW_UPPER = up;
if (main >= 0) LYW_MAIN = main;
if (low >=0) LYW_UNDER = low;
LYW_TOTAL = LYW_UPPER + LYW_MAIN + LYW_UNDER;
XWIDTH = XWIDTH0;
dotall1 = (YWIDTH0)*LYW_MAIN0 - (LYW_MAIN0*3); /* 実際の表示ドット数 */
/* YWIDTH = 31 */
YWIDTH = (dotall1/LYW_TOTAL) + 2;
UNDER_Y = YWIDTH - 1;
/* ウインドウは1つだけ */
for(yd=0,i=0;i< YWIDTH-2;i++,yd += LYW_TOTAL) {
YDOT[i] = yd ; LYW_UPPER;
}
YDOT[i++] = yd;yd += LYW_MAIN; /* TWIDTH-2 */
YDOT[i++] = yd;yd += LYW_MAIN; /* TWIDTH-1 */
YDOT[i] = (YWIDTH0-1)*LYW_MAIN0; /* TWIDTH-0:特別 */
ny = doty/LYW_TOTAL;
return(ny);
}
int
ctrl_t_lyw_work_check()
{
if (CWY0 || (CWY1 != UNDER_Y-2)) { /* ウインドウが複数個ひらいている */
under_print((STR)"[ウインドウをひとつにしてから実行して下さい]");
return(1);
} else {
return(0);
}
}
/* この関数が呼ばれる時は、ウインドウは CWN だけ */
/* -1 なら変えない */
void
ctrl_t_lyw_work(int up,int main,int low)
{
register int i;
int newy;
newy = ctrl_t_lyw_work0(up,main,low);
/* 表示変更 */
line_seigyou();
window_change_size(CWN,0,0,XWIDTH-1,YWIDTH-3); /* カレントをフルサイズに */
init_clear_screen();
for(i=0;i<YWIDTH0;i++) {
SCREEN[i] = NIL;
}
for(i=0;i<MAX_WINDOW;i++) {
if (WDATA[i].WTEXTS >= 0) {
disp_btm_line(i);
SCREEN[WDATA[i].WY1+1] = NOT; /* -1 */
}
}
if (newy > CWY1) newy = CWY1;
disp_cl_y(newy);
work_cursor_cpx();
}
#if 0
void
ctrl_t_ctrl_d()
{
int i;
window0();
printf("%s\n",TBUFF);
for(i=0;i<(min(TBUFFC,30));i++) {
printf("%x:",TBUFF[i]);
}
}
#endif
/* マークとの間を未変換にする */
void
ctrl_t_t()
{
UNIT *wp;
int bp;
int y;
int a;
if ((a = etc_get_arg()) >= MAX_MARK) {
under_print((STR)"マーク番号が不適当です");
return;
}
line_seigyou();
if (wp = mark_get_mark(a,&bp)) {
if ((wp != CL) || (bp != ANALYZE[CPX].BPOS)) {
ctrl_t_t0(wp,bp,CL,ANALYZE[CPX].BPOS);
disp_show_cursor();
} else {
under_blanc();
}
} else {
UBYTE w[MAXLINE];
sprintf((char *) w,"マーク %1d は設定されていません",a);
under_print(w);
}
}
void
ctrl_t_t0(UNIT *p1,int b1,UNIT *p2,int b2)
{
UBYTE w[VERY_LONG_LINE],w0[VERY_LONG_LINE];
register UNIT *wp;
register int be;
UINT mask;
UNIT *p00,*p000;
int b00,b000;
p000 = CL;
b000 = ANALYZE[CPX].BPOS;
if (etc_line_order(&p1,&b1,&p2,&b2)) { /* 勝手に入れ替えてくれる */
/* その行がカレントウインドウの中にあるかどうかを調べる */
/* あったなら相対的なY座標、なければ-1を返す */
register int lc1=0,lc2=0;
register UNIT *p;
p00 = p1;b00 = b1;
if (p1 != p2) {
p = HEAD->ATO;
while(p != p2) {
if (p == p1) {
lc1 = lc2;
}
lc2++;
p = p->ATO;
}
}
if ((lc2-lc1) > (CWY1-CWY0)) {
goto finis;
}
if (window_is_this_line_in_current(p1) < 0) { /* 前が入ってない */
disp_top_flush(p1);
} else if (window_is_this_line_in_current(p2) < 0) { /* 後が入ってない */
int movel;
disp_top_flush(line_trace(p2,-CWY1,&movel));
}
jump(p1,b1); /* 前に飛ぶ */
TTOPL00 = line_my_top(); /* キャンセル用に保存 */
TL00 = TL0 = CL; /* 変換バッファの開始行 */
CRX = CRY = 0;
TPX00 = TPX0 = CPX;
TX00 = TX0 = CX;
TY00 = TY0 = CY;
TBP00 = TBP0 = ANALYZE[CPX].BPOS;
xf_init_tb(); /* 変換バッファカウンタ初期化 */
w[0] = EOS;
while(1) {
if (p1 == p2) { /* 同じ行であった */
line_get_body(w0,p1);
w0[b2] = EOS;
if (etc_limit_strcat(w,&w0[b1],VERY_LONG_LINE)) {
goto finis;
}
if (b1 != b2) {
change_check();
}
break;
} else {
line_get_body(w0,p1);
if (etc_limit_strcat(w,&w0[b1],VERY_LONG_LINE)) {
goto finis;
}
if (b1 != strlen(w0)) {
change_check();
}
}
p1 = p1->ATO;
b1 = 0;
}
if (xf_set_tb_check(w)) {
goto finis;
}
mask = mark_find_mark(w);
jump(p1,b1);
if (mask) { /* 再変換する中にマークがあった */
register UINT m = 1,bc = 0;
STR p;
jump(p00,b00); /* 範囲始めに飛ぶ */
for(;mask;m <<= 1,bc++) {
if (mask & m) {
mask ^= m; /* ビットを倒す */
mark_set_mark(bc);
}
}
p = line_skip_mark(&CL_DATA[ANALYZE[CPX].BPOS]);
TBP00 = TBP0 = (int) (p - CL_DATA);
}
jump(p2,b2);
TL1 = p2; /* 変換バッファの終了行 */
TPX1 = CPX;
TX1 = CX;
TY1 = CY;
TBP1 = ANALYZE[CPX].BPOS;
xf_set_tb(w);
}
under_blanc();
return;
finis:
etc_beep();
jump(p000,b000);
under_print("再変換にする対象が長すぎます");
return;
}
/* クリックのON/OFF */
/* トグルする */
void
ctrl_t_click()
{
if (CLICK_MODE) {
CLICK_MODE = 0;
} else {
CLICK_MODE = 1;
}
}
/* 情報付ファイルセーブ */
void
ctrl_t_ctrl_s()
{
line_seigyou();
if (CURRENT_CHANGED) {
if (buff_save_file(1,NIL,NIL,NULL)) {
CURRENT_CHANGED = 0;
disp_btm_changed_erase_x(CURRENT_TEXT);
}
} else {
under_blanc();
}
}
/* ファイル字詰め改行書き出し */
void
ctrl_t_ctrl_w()
{
int flag,i = 0,i_rubi = 0,i_ul = 0;
UBYTE filename[MAXLINE];
UBYTE w[VERY_LONG_LINE*4],w0[VERY_LONG_LINE*4];
UNIT *wp;
FILE *fp;
line_seigyou();
sprintf((char *) w,"ファイル字詰め改行書き出し [%s]: ",etc_ret_current_path());
if (under_input_cr_raw(w,filename) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
return;
}
under_print((STR)"[書き出し中...]");
if (!(fp = fopen((char *)filename,"w+b"))) {
under_print("ファイルをオープンできません。[中断]");
return;
}
wp = HEAD->ATO;
while(wp != TAIL) {
line_get_body(w0,wp); /* 一行持ってくる */
if (cut_rubi_convert(w0,w,CURRENT_JIZUME)) {
if (ctrl_t_ctrl_w_sub(w,fp)) {
goto ctrl_t_ctrl_w_err;
}
i_rubi++;
}
/* ない訳がない */
string_to_main_string(w,w0);
if (ctrl_t_ctrl_w_sub(w,fp)) {
goto ctrl_t_ctrl_w_err;
}
i++;
if (cut_ul_convert(w0,w,CURRENT_JIZUME)) {
if (ctrl_t_ctrl_w_sub(w,fp)) {
goto ctrl_t_ctrl_w_err;
}
i_ul++;
}
wp = wp->ATO;
}
sprintf((char *) w,"[%d 行(その内、ルビ=(%d)行,下線=(%d)行)]",i+i_rubi+i_ul,i_rubi,i_ul);
under_print(w);
if (fflush(fp)) {
goto ctrl_t_ctrl_w_err;
}
fclose(fp);
return;
ctrl_t_ctrl_w_err:
under_print((STR)"書き込みエラーが発生しました。[中断]");
fclose(fp);
}
int
ctrl_t_ctrl_w_sub(STR w,FILE *fp)
{
if (etc_last(w) != CR) {
strcat(w,"\x0d\x0a");
} else {
int l;
l = strlen(w);
w[l-1] = (UBYTE) '\x0d';
w[l] = (UBYTE) '\x0a';
w[l+1] = EOS;
}
return(fputs((char *)w,fp));
}
#if 0
/* カットバッファをダンプする(デバッグ用) */
void
ctrl_t_cbd()
{
int c,get_buff_c;
UBYTE w[VERY_LONG_LINE];
window0();
get_buff_c = 0;
while(1) {
c = buff_get_from_cut_buff(w,0,get_buff_c);
/* カットバッファより1行取ってくる */
if (c < 0) { /* もうない */
break;
}
get_buff_c = c + 1;
printf(":%s:\n",w);
}
binkey();
}
#endif
extern COMMAND_UNIT command_table[MAX_COMMAND_NUMBER];
extern COMMAND_UNIT command_table0[MAX_COMMAND_NUMBER];
extern COMMAND_UNIT command_table1[MAX_COMMAND_NUMBER];
/* トグルする */
void
ctrl_t_cmd()
{
if (CMDMOD) { /* me にする */
ctrl_t_me();
} else { /* ed にする */
ctrl_t_ed();
}
}
/* EM */
STR function_table[2][32] = { /* em */
(STR)"\xfe先頭行\0", /* F1 = esc< */
(STR)"\xfe最終行\0", /* F2 = esc> */
(STR)"\xfe 置換 \0", /* F3 = esc-R */
(STR)"\xfe 検索 \0", /* F4 = ^S */
(STR)"\xfe次検索\0", /* F5 = ^Sesc */
(STR)"\xfe MARK \0", /* F6 = esc. */
(STR)"\xfe 削除 \0", /* F7 = ^W */
(STR)"\xfe 複写 \0", /* F8 = escW */
(STR)"\xfe 貼付 \0", /* F9 = ^Y */
(STR)"\xfe*EXIT*\0", /* F10 = escZ */
(STR)"", /* F11 = */
(STR)"", /* F12 = */
(STR)"", /* F13 = */
(STR)"", /* F14 = */
(STR)"", /* F15 = */
(STR)"", /* F16 = */
(STR)"", /* F17 = */
(STR)"", /* F18 = */
(STR)"", /* F19 = */
(STR)"", /* F20 = */
(STR)"\x16", /* R-UP=^V (20)*/
(STR)"\x1a", /* R-DN=^Z (21)*/
(STR)"", /* INS */
(STR)"\x04", /* DEL */
(STR)"\x10", /* UP */
(STR)"\x02", /* LEFT (25)*/
(STR)"\x06", /* RIGHT (26)*/
(STR)"\x0e", /* DN (27)*/
(STR)"\x1f", /* CLR (28)*/
(STR)"", /* HELP */
(STR)"", /* HOME */
(STR)"", /* UNDO */
/* ED */
(STR)"\xfe先頭行\0", /* F1 = ed_ESC_B */
(STR)"\xfe最終行\0", /* F2 = ed_ESC_Z */
(STR)"\xfe 置換 \0", /* F3 = ed_ESC_R */
(STR)"\xfe 検索 \0", /* F4 = ed_ESC_N */
(STR)"\xfe次検索\0", /* F5 = ed_ESC_N_ESC */
(STR)"\xfe 範囲 \0", /* F6 = ed_ESC_. */
(STR)"\xfe 削除 \0", /* F7 = ed_ctrl_j_ctrl_w */
(STR)"\xfe 複写 \0", /* F8 = ed_ctrl_j_ESC_W */
(STR)"\xfe 貼付 \0", /* F9 = ed_ctrl_j_ctrl_y */
(STR)"\xfe二重化\0", /* F10 = ed_ctrl_j_2 */
(STR)"", /* F11 = */
(STR)"", /* F12 = */
(STR)"", /* F13 = */
(STR)"", /* F14 = ed_ctrl_j_ctrl_r:逆方向検索 */
(STR)"", /* F15 = ed_ctrl_j_ctrl_r_ESC:逆方向次検索 */
(STR)"", /* F16 = 複数ファイル正順切り替え */
(STR)"", /* F17 = 複数ファイル逆順切り替え */
(STR)"", /* F18 = */
(STR)"", /* F19 = */
(STR)"", /* F20 = */
(STR)"\x03", /* R-UP */
(STR)"\x12", /* R-DN */
(STR)"", /* INS */
(STR)"\x07", /* DEL */
(STR)"\x05", /* UP ^E */
(STR)"\x13", /* LEFT ^S */
(STR)"\x04", /* RIGHT ^D */
(STR)"\x18", /* DN ^X */
(STR)"\x1f", /* CLR */
(STR)"", /* HELP *//* キーバインド一覧 */
(STR)"", /* HOME *//* ^jH */
(STR)"" /* UNDO *//* ^jE */
};
void
ctrl_t_ed0()
{
register int i;
CMDMOD = 1;
for(i=0;i<MAX_COMMAND_NUMBER;i++) {
command_table[i] = command_table1[i];
}
ctrl_t_cmd_cpy();/* func key set */
if ((QUOTE = etc_command_pick('V'-'@',ed_ctrl_v)) & 0x80) {
etc_command_patch_miss("コントロールコード入力",QUOTE &= 0x7f);
}
if ((XF_NEXT_BLOCK_KEY = etc_command_pick('X'-'@',ed_ctrl_x)) & 0x80) {
etc_command_patch_miss("カーソルキーの「↓」",XF_NEXT_BLOCK_KEY &= 0x7f);
}
*function_table[1][27] = XF_NEXT_BLOCK_KEY;
if ((XF_BEFORE_BLOCK_KEY = etc_command_pick('E'-'@',ed_ctrl_e)) & 0x80) {
etc_command_patch_miss("カーソルキーの「↑」",XF_BEFORE_BLOCK_KEY &= 0x7f);
}
*function_table[1][24] = XF_BEFORE_BLOCK_KEY;
if ((XF_RIGHT_KOHO_KEY = etc_command_pick('D'-'@',ed_ctrl_d)) & 0x80) {
etc_command_patch_miss("カーソルキーの「→」",XF_RIGHT_KOHO_KEY &= 0x7f);
}
*function_table[1][26] = XF_RIGHT_KOHO_KEY;
if ((XF_LEFT_KOHO_KEY = etc_command_pick('S'-'@',ed_ctrl_s)) & 0x80) {
etc_command_patch_miss("カーソルキーの「←」",XF_LEFT_KOHO_KEY &= 0x7f);
}
*function_table[1][25] = XF_LEFT_KOHO_KEY;
if ((XF_NEXT_PAGE_KEY = etc_command_pick('C'-'@',ed_ctrl_c)) & 0x80) {
etc_command_patch_miss("「ROLL UP」キー",XF_NEXT_PAGE_KEY &= 0x7f);
}
*function_table[1][20] = XF_NEXT_PAGE_KEY;
if ((XF_BEFORE_PAGE_KEY = etc_command_pick('R'-'@',ed_ctrl_r)) & 0x80) {
etc_command_patch_miss("「ROLL DOWN」キー",XF_BEFORE_PAGE_KEY &= 0x7f);
}
*function_table[1][21] = XF_BEFORE_PAGE_KEY;
etc_kb_wash();
}
void
ctrl_t_ed()
{
ctrl_t_ed0();
under_print((STR)"[ED.X モードにしました]");
}
void
ctrl_t_me0()
{
register int i;
CMDMOD = 0;
for(i=0;i<MAX_COMMAND_NUMBER;i++) {
command_table[i] = command_table0[i];
}
ctrl_t_cmd_cpy();/* func key set */
if ((QUOTE = etc_command_pick('Q'-'@',ctrl_q)) & 0x80) {
etc_command_patch_miss("コントロールコード入力",QUOTE &= 0x7f);
}
if ((XF_NEXT_BLOCK_KEY = etc_command_pick('N'-'@',ctrl_n)) & 0x80) {
etc_command_patch_miss("カーソルキーの「↓」",XF_NEXT_BLOCK_KEY &= 0x7f);
}
*function_table[0][27] = XF_NEXT_BLOCK_KEY;
if ((XF_BEFORE_BLOCK_KEY = etc_command_pick('P'-'@',ctrl_p)) & 0x80) {
etc_command_patch_miss("カーソルキーの「↑」",XF_BEFORE_BLOCK_KEY &= 0x7f);
}
*function_table[0][24] = XF_BEFORE_BLOCK_KEY;
if ((XF_RIGHT_KOHO_KEY = etc_command_pick('F'-'@',ctrl_f)) & 0x80) {
etc_command_patch_miss("カーソルキーの「→」",XF_RIGHT_KOHO_KEY &= 0x7f);
}
*function_table[0][26] = XF_RIGHT_KOHO_KEY;
/*window0();printf("[%x]",XF_RIGHT_KOHO_KEY);binkey();*/
if ((XF_LEFT_KOHO_KEY = etc_command_pick('B'-'@',ctrl_b)) & 0x80) {
etc_command_patch_miss("カーソルキーの「←」",XF_LEFT_KOHO_KEY &= 0x7f);
}
*function_table[0][25] = XF_LEFT_KOHO_KEY;
/*window0();printf("[%x]",XF_LEFT_KOHO_KEY);binkey();*/
if ((XF_NEXT_PAGE_KEY = etc_command_pick('V'-'@',ctrl_v)) & 0x80) { /* ^V */
etc_command_patch_miss("「ROLL UP」キー",XF_NEXT_PAGE_KEY &= 0x7f);
}
*function_table[0][20] = XF_NEXT_PAGE_KEY;
if ((XF_BEFORE_PAGE_KEY = etc_command_pick('Z'-'@',ctrl_z)) & 0x80) { /* ^Z */
etc_command_patch_miss("「ROLL DOWN」キー",XF_BEFORE_PAGE_KEY &= 0x7f);
}
*function_table[0][21] = XF_BEFORE_PAGE_KEY;
etc_kb_wash();
}
void
ctrl_t_me()
{
ctrl_t_me0();
under_print((STR)"[ME モードにしました]");
}
ctrl_t_cmd_cpy()
{
register int i;
register STR p;
for(i=1;i<=32;i++) {
if (p = function_table[CMDMOD][i-1]) {
FNCKEYST(i,p);
/* FNCKEYST(i,"");*/
}
}
}
#if 0
void
ctrl_t_f()
{
int f,c;
STR p;
int main_or_sub,hinshi;
UBYTE yomi[MAXLINE],mojiretu[MAXLINE];
UBYTE w[MAXLINE];
UNIT *wp;
etc_while_fep_qxf();
c = work_make_cut_buff0_list((STR)NULL,(STR)"",(STR)"");
/* -1 = 空、さもなくば、CUT_BUFF の総バイト長を返す */
if (c <= 0) {
under_print((STR)"カットバッファの中にセットする文字列を入れておいて下さい[中断]");
return;
}
if (c >= 32) {
under_print((STR)"セットしようとする文字列が長すぎます[中断]");
return;
}
wp = work_get_from_cut_buff0_list(); /* 一行持って来る */
line_get_body(mojiretu,wp);
sprintf((char *) w,"[%s] をどのファンクションキーにセットしますか? [F11-F20]",mojiretu);
under_print0(w);
while(1) {
UINT code;
if ((code = fep_qxf()) > 0x200) {
window0();
printf("[%x]",code);binkey();
FNCKEYST((code & 0x00f) + 10,mojiretu);
break;
}
if (fep_INKEY() == '\x1b') { /* ESC だ */
under_print((STR)"[中断]");
break;
}
}
etc_while_fep_qxf(); /* 離されるまで待つ */
/* under_blanc();*/
}
#endif
#if 0
void
ctrl_t_q()
{
under_print(BAG);binkey();
}
#endif
/* 対応する括弧を挿入する */
void
ctrl_t_pair_left()
{
ctrl_t_pair_r_l(-1);
}
/* 対応する括弧を挿入する */
void
ctrl_t_pair_right()
{
ctrl_t_pair_r_l(1);
}
/* 対応する括弧を挿入する */
void
ctrl_t_pair_r_l(int delta)
{
UNIT *wp;
int a,bp;
UBYTE w[VERY_LONG_LINE];
STR p;
UINT c;
if ((a = etc_get_arg()) >= MAX_MARK) {
under_print((UBYTE *)"マーク番号が不適当です");
return;
}
if (wp = mark_get_mark(a,&bp)) { /* マークが存在した */
line_get_body(w,wp);
p = line_skip_xcode(&w[bp]);
if (etc_char_byte_haba(p) == 2) {
c = (*p++) << 8;
c |= *p;
c += delta;
work_insert2(c);
} else {
c = *p;
c += delta;
if ((c == 0) || ( c == 0x80)
|| (c == 0x9f) || (c == 0xe0)) {
under_print("対応する文字列が不適当です");
return;
}
work_insert1(c);
}
change_check();
under_blanc();
work_cursor_cpx();
} else { /* マークが存在しない */
UBYTE w[MAXLINE];
sprintf((char *) w,"マーク %1d は設定されていません",a);
under_print(w);
}
}
void
ctrl_t_dm()
{
/* xf_dic_flush();*/
xf_dic_learn_mode();
etc_while_fep_qxf(); /* 離されるまで待つ */
}
/* マークとの間にアンダーラインを入れる */
void
ctrl_t_ctrl_l()
{
UNIT *wp;
int bp;
int y;
int a;
if ((a = etc_get_arg()) >= MAX_MARK) {
under_print((STR)"マーク番号が不適当です");
return;
}
line_seigyou();
if (wp = mark_get_mark(a,&bp)) {
if (!LYW_UNDER && (!CWY0 && (CWY1 == UNDER_Y-2))) {
ctrl_t_l();
}
work_set_underline(wp,bp,CL,ANALYZE[CPX].BPOS);
line_cl_cl();
work_line_analyze();
under_print((STR)"[下線]");
work_cursor_cpx();
} else {
UBYTE w[MAXLINE];
sprintf((char *) w,"マーク %1d は設定されていません",a);
under_print(w);
}
}
/* マークとの間のアンダーライン消去 */
ctrl_t_ctrl_r()
{
UNIT *wp;
int bp;
int a;
if ((a = etc_get_arg()) >= MAX_MARK) {
under_print((STR)"マーク番号が不適当です");
return;
}
line_seigyou();
if (wp = mark_get_mark(a,&bp)) {
work_erase_underline(wp,bp,CL,ANALYZE[CPX].BPOS);
line_cl_cl();
work_line_analyze();
under_print((STR)"[下線消去]");
work_cursor_cpx();
} else {
UBYTE w[MAXLINE];
sprintf((char *) w,"マーク %1d は設定されていません",a);
under_print(w);
}
}
#if 0
/* デバック用 */
void
ctrl_t_d()
{
window0();
printf("[%x][%x][%x]\n",HEAD->MAE,HEAD,HEAD->ATO);
printf("[%x][%x][%x]\n",CL->MAE,CL,CL->ATO);
printf("[%x][%x][%x]\n",TAIL->MAE,TAIL,TAIL->ATO);
binkey();
}
/* デバック用 */
void
ctrl_t_dd(int n)
{
int i;
window0();
for(i=0;i<MAX_WINDOW;i++) {
printf("(%d)[%d:%d][%d]\n",i,WDATA[i].WY0,WDATA[i].WY1,
WDATA[i].WTEXTS);
}
binkey();
}
void
ctrl_t_d()
{
int i;
UBYTE t[MAXLINE];
register UINT c;
window0();
line_get_body(t,CL->MAE);
B_PRINT("\x1b[0K");
for(i=0;i<32;i++) {
if (iskanji(c = t[i])) {
c = (c<<8) | t[++i];
}
if (!t[i]) break;
printf("[%x]",c);
}
printf("\n");
line_get_body(t,CL);
B_PRINT("\x1b[0K");
for(i=0;i<32;i++) {
if (iskanji(c = t[i])) {
c = (c<<8) | t[++i];
}
if (!t[i]) break;
printf("[%x]",c);
}
printf("\n");
line_get_body(t,CL->ATO);
B_PRINT("\x1b[0K");
for(i=0;i<32;i++) {
if (iskanji(c = t[i])) {
c = (c<<8) | t[++i];
}
if (!t[i]) break;
printf("[%x]",c);
}
printf("\n");
binkey();
}
void
dump(int n,STR t)
{
int i;
register UINT c;
window0();
B_PRINT("\x1b[0K");
for(i=0;i<32;i++) {
if (iskanji(c = t[i])) {
c = (c<<8) | t[++i];
}
if (!t[i]) break;
printf("[%x]",c);
}
printf("{%d}\n",n);
binkey();
}
#endif
/* 印刷 */
void
ctrl_t_p()
{
PRN_TATE_MODE = 0;
prnt_do();
}
/* 縦書き印刷 */
void
ctrl_t_pt()
{
PRN_TATE_MODE = 1;
prnt_do();
}
/* カットバッファを */
void
ctrl_t_s1()
{
ctrl_t_get_cut("STRING-1 ← ",STRING_ESC1);
}
/* カットバッファを */
void
ctrl_t_s2()
{
ctrl_t_get_cut("STRING-2 ← ",STRING_ESC2);
}
void
ctrl_t_get_cut(STR mess,STR d)
{
UBYTE w[MAXLINE],w0[MAXLINE];
UNIT *wp;
work_make_cut_buff0_list((STR)NULL,"","");
*w = EOS;
while(1) {
if (!(wp = work_get_from_cut_buff0_list())) { /* 一行持って来る */
break;
}
line_get_body(w0,wp);
if (strlen(w0)) {
if (strlen(w)+strlen(w0) < MAXLINE/2) {
strcat(w,w0);
} else {
under_print("[カットバッファが長すぎます]");
return;
}
} else {
break;
}
}
string_to_main_string(d,w); /* メイン文字だけにして転送 */
strcpy(w,mess);
strcat(w,"\"");
etc_string_esc_cnv(d,w0);
strcat(w,w0);
strcat(w,"\"");
under_print(w);
}
/* タグジャンプ */
void
ctrl_t_v()
{
register UWORD c;
register STR p0,p;
int linenumber;
UBYTE name[VERY_LONG_LINE];
int cmd0;
if (!(p0 = etc_first_filename_char(CL_DATA))) {
goto tag_error;
}
if (isalpha(*p0)) { /* 英字であるから */
if (p0[1] == ':') {
p = p0+2;
} else {
p = p0+1;
}
} else {
p = p0 + etc_char_byte_haba(p0);
}
while(c = etc_jfirst(p)) { /* 存在する */
if (etc_is_filename_char(c)) {
p += etc_char_byte_haba(p);
} else {
break;
}
}
strncpy(name,p0,p-p0);
name[p-p0] = EOS;
if (!*name) {
goto tag_error;
}
/* 名前を得た */
while(1) {
if (c = etc_jfirst(p)) { /* 存在する */
if (isdigit(c)) {
break;
} else {
p += etc_char_byte_haba(p);
}
} else { /* EOS にぶつかった */
goto tag_error;
}
}
linenumber = atoi(p);
/* 実行する */
mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN); /* システムマーク */
cmd0 = CMDMOD;
CMDMOD = 0;
ctrl_x_ctrl_f1_alway(name);
CMDMOD = cmd0;
meta_g0(linenumber);
return;
tag_error:
etc_beep();
under_print("[タグファイルが無効です]");
}
/* ヘルプ */
void
ctrl_t_h()
{
etc_func_off();
help();
etc_func_on();
ctrl_l();
}
void
ctrl_t_PAGE()
{
UBYTE w[MAXLINE];
PAGE = etc_get_arg();
sprintf(w,"ページを %d 行に設定しました",PAGE);
under_print(w);
}
UBYTE devname0[MAXLINE] = {EOS};
/* デバイス書き出し */
void
ctrl_t_dev()
{
int i = 0,l;
UBYTE devname[MAXLINE];
UBYTE w[VERY_LONG_LINE*4],w0[VERY_LONG_LINE*4],w00[VERY_LONG_LINE*4];
UNIT *wp;
FILE *fp;
line_seigyou();
sprintf((char *) w,"検索 [%s]<META>",STRING_ESC1_s);
sprintf((char *) w,"デバイス書き出し [%s]: ",devname0);
if (under_input_cr_raw(w,devname) < 0) { /* 無効であった = ^G */
if (devname[0] == 0x0d) { /* いきなり改行 */
strcpy(devname,devname0);
} else {
under_print((STR)"[中断]");
return;
}
} else {
strcpy(devname0,devname);
}
if (!*devname) { /* デバイス名が指定されなかった */
under_print((STR)"デバイス名が異常です:[中断]");
return;
}
if (!(fp = fopen(devname,"wt")) < 0) {
/* エラー */
under_print((STR)"デバイスをオープンできません。[中断]");
return;
}
under_print((STR)"[書き出し中...]");
wp = HEAD->ATO;
*w00 = EOS;
while((wp != TAIL) || *w00) {
*w = EOS;
while(1) {
if (*w00) {
strcpy(w,w00);
}
if (etc_last(w) == CR) {
break;
}
if (wp == TAIL) {
break;
}
line_get_body(w0,wp); /* 一行持ってくる */
wp = wp->ATO;
i++;
string_to_main_string(w00,w0);
if ((strlen(w)+strlen(w00)) < VERY_LONG_LINE*4) {
strcat(w,w00);
*w00 = EOS;
} else {
break; /* 長すぎるので途中でフラッシュ */
}
}
l = strlen(w);
if (fwrite(w,1,l,fp) != l) {
etc_beep();
under_print((STR)"書き込みエラーが発生しました。[中断]");
fclose(fp);
return;
}
}
fclose(fp);
sprintf((char *) w,"[%d 行]",i);
under_print(w);
}